﻿//*************************************************************************
//面向服务的协作式智能交通系统仿真软件SoC-ITSS v2.1 alpha
//发布单位：西北工业大学--巴黎高科MINES机器人与群智能系统联合实验室
//团队负责人：张凯龙 Zhang Kailong
//团队成员：张大方、杨安胜、王敏、谢策、王雨佳、谢尘玉等
//联系我们：kl.zhang@nwpu.edu.cn
//2012-2021
//*************************************************************************

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

//*******************************************************
//
//文件名(File Name):           VehicleManager.cs
//
//数据表(Tables):              nothing 

//          修改理由：         创建类
//
//*******************************************************

namespace CyberCarSimulation.Regulation
{

    /************************************************************************/
    /**
     * 有FIFO_Sche和PrioFIFO_Sche类的对象使用的类，保存Vehicle的一些相关信息，以备调度时使用
     * 车辆管理类，一个VehicleManager对象对应着某一辆车对一个SCS资源的需求。
     */
    /************************************************************************/
    class VehicleManager
    {
        private bool Scheduable;    //对应的Vehicle对象是否可以调度
        private float Ts;           //车辆到达路口的时间
        private float Te;           //车辆离开路口的时间
        private float Origin_Ts;    //车辆的原到达时间
        private float Origin_Te;    //车辆的原离开时间
        private string ID;          //对应车辆的ID
        private string SectionIDs;  //需要占用的S-CS资源名称
        private int Priority;       //车辆的原优先级，不可改变
        private int LaneID;         //车辆所在车道的ID
        private int CurrentPriority;//车辆的现优先级，可改变，可提升优先级

        private float Current_Dis;  //车辆的现在所处的位置
        public bool[] Token;        //车辆对现在临界区的占有情况，用于按顺序申请临界区，若为true则表示申请成功

        /*供MultiSCSFIFO_Sche及MultiSCSPrioFIFO_Sche使用*/
        public bool HasToken;   //表示是否已经获得临界区，false表示未占用
        private int CS_Count;   //车辆临界区的数量
        public bool isSelect;   //用于标识车辆是否在遍历选择前车的过程中被选中，若为true则被选中 


        public VehicleManager(string ID, int LaneID, float Ts, float Te, float Total_Dis, string SectionIDs, int Priority, bool Scheduable)
        {
            this.ID = ID;                   //对应车辆的ID
            this.LaneID = LaneID;           //车辆所在车道的ID
            this.Ts = Ts;                   //车辆到达路口的时间
            this.Te = Te;                   //车辆离开路口的时间
            this.Priority = Priority;       //车辆的优先级
            this.CurrentPriority = Priority;//现在优先级
            this.Scheduable = Scheduable;   //对应的Vehicle对象是否可以调度
            this.Current_Dis = Total_Dis;   //车辆的现在的位置
            this.Origin_Ts = Ts;            //车辆到达路口时间
            this.Origin_Te = Te;            //车辆离开路口时间
            this.SectionIDs = SectionIDs;   //需要占用的S-CS资源名称
            this.Token = new bool[5];       //车辆对现在临界区的占有情况
            this.Token[0] = true;
            this.Token[1] = false;
            this.Token[2] = false;
            this.Token[3] = false;
            this.Token[4] = false;
            this.HasToken = false;
            this.isSelect = false;

            this.getApproximation();
        }

        /************************************************************************/
        /* 获取近似值                                                                     */
        /************************************************************************/
        private void getApproximation()
        {
            this.Ts = (float)Math.Round(this.Ts, Definitions.Precise);
            this.Te = (float)Math.Round(this.Te, Definitions.Precise);
            this.Current_Dis = (float)Math.Round(this.Current_Dis, Definitions.Precise);
        }

        //设置车辆需要临界区的数目
        public void setCSCount(int i)
        {
            this.CS_Count = i;
        }

        //获得车辆的临界区数量
        public int getCSCount()
        {
            return this.CS_Count;
        }

        //若临界区的数量小于4，则用0补全
        public void resetSectionIDs()
        {
            while (this.SectionIDs.Length < 4)
            {
                this.SectionIDs += "0";
            }
        }

        //用于改变当前车辆的优先级
        public void setCurrentPriority(int Priority)
        {
            this.CurrentPriority = Priority;
        }

        //标识是否可以调度
        public void setSchedulable(bool b)
        {
            this.Scheduable = b;
        }

        //更新PTW信息
        public void updatePTW(float Ts, float Te)
        {
            this.Ts = Ts;
            this.Te = Te;
            this.getApproximation();
        }

        public string getSectionIDs()
        {
            return this.SectionIDs;
        }

        public float getCurrent_Dis()
        {
            return this.Current_Dis;
        }

        public bool getScheduable()
        {
            return this.Scheduable;
        }
        public void setTs(float ts)
        {
            this.Ts = ts;
        }

        public float getTs()
        {
            return this.Ts;
        }

        public void setTe(float te)
        {
            this.Te = te;
        }

        public float getTe()
        {
            return this.Te;
        }

        public string getID()
        {
            return this.ID;
        }

        public int getLaneID()
        {
            return this.LaneID;
        }

        public int getOriginalPriority()
        {
            return this.Priority;
        }

        public int getCurrentPriority()
        {
            return this.CurrentPriority;
        }

        public float getOriginTs()
        {
            return this.Origin_Ts;
        }

        public float getOriginTe()
        {
            return this.Origin_Te;
        }
    }
}
